
package com.viweb.storemanager.core;

import java.text.NumberFormat;
import java.text.ParseException;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;

public class IntegerVerifier extends InputVerifier {

    private NumberFormat format;
    private boolean negative;
    private int max = -1;
    private int min = -1;

    public IntegerVerifier(NumberFormat format) {
        this.format = format;
    }
    
    public IntegerVerifier(NumberFormat format, boolean negative) {
        this.format = format;
        this.negative = negative;        
    }

    public IntegerVerifier(NumberFormat format, int max) {
        this.format = format;
        this.max = max;
    }

    public IntegerVerifier(NumberFormat format, int min, int max) {
        this.format = format;
        this.max = max;
        this.min = min;
    }

    public boolean verify(JComponent input) {
        if (!(input instanceof JFormattedTextField)) {
            return true;
        }

        JFormattedTextField ftf = (JFormattedTextField) input;
        String str = ftf.getText();
        if (str.length() == 0) {
            ftf.setValue(null);
        } else {
            try {
                Number number = this.format.parse(str);
                int value = number.intValue();
                
                // Trường hợp không giới hạn giá trị
                if (this.min == -1 && this.max == -1) {
                    // Nếu chỉ chấp nhận số dương
                    if (!this.negative) {
                        ftf.setValue(value < 0 ? new Integer(0) : new Integer(value));
                    } else {
                        ftf.setValue(new Integer(value));
                    }
                // Trường hợp giới hạn giá trị trong khoảng
                } else if (this.min > -1 && this.max > -1) {
                    // Nếu giá trị nhập vào nhỏ hơn giá trị min
                    if (value < this.min) {
                        ftf.setValue(new Integer(this.min));
                    // Nếu giá trị nhập vào lớn hơn giá trị max
                    } else if (value > this.max) {
                        ftf.setValue(new Integer(this.max));
                    } else {
                        ftf.setValue(new Integer(value));
                    }
                // Trường hợp chỉ chặn trên
                } else if (this.max > -1) {
                    ftf.setValue(value > this.max ? new Integer(this.max) : new Integer(value));
                } else {
                    ftf.setValue(new Integer(value));
                }
            } catch (ParseException ex) {
                // If users enter not-a-number value
                // the text field the auto set to null value
                ex.getMessage();
                // ftf.setValue(null);
            }
        }

        return true;
    }
}